[AIT-1081] Update liveobjects uts-to-kotlin skill to generate tests#1221
Conversation
|
Warning Review limit reached
Next review available in: 31 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
WalkthroughThe UTS test module now uses separate unit and integration Gradle tasks and CI jobs, reorganized infra packages, new direct-sandbox and LiveObjects tests, and updated UTS skill docs, resolver, mapping, and reference guides. ChangesUTS infrastructure, tests, and translation docs
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Move the human-readable UTS guide and its self-contained HTML rendering into the uts/ module as README.md and index.html. Both cover the UTS concept, the three test tiers, the spec docs, the uts/ module layout, mock/proxy infrastructure, the two example tests, deviations, and appendices. Spec-doc references link to GitHub; paths are fully qualified; the two artifacts are kept in sync. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ier Gradle tasks Reorganise the uts module under a domain-rooted io.ably.lib.uts package that cleanly separates infrastructure from tests, and unit from integration: infra/ shared awaits (Utils.kt) infra/unit/ mock transports + ConnectionDetails builder infra/integration/ SandboxApp infra/integration/proxy/ ProxyManager, ProxySession unit/realtime/ ConnectionRecoveryTest (mocked) integration/proxy/realtime/ AuthReauthTest (sandbox + proxy) - The ConnectionDetails test builder no longer sits in io.ably.lib.types, so it obtains the package-private constructor reflectively (as liveobjects/TestUtils.kt does). - Add runUtsUnitTests / runUtsIntegrationTests Gradle tasks (filtered by package), mirroring runLiveObjectsUnitTests / runLiveObjectsIntegrationTests. - check.yml now runs :uts:runUtsUnitTests; integration-test.yml gains a check-uts job running :uts:runUtsIntegrationTests. - Bring uts/README.md and uts/index.html in sync with the new structure.
884ee87 to
aa0504e
Compare
Reflect the new test-source structure in the UTS guide, website, and the uts-to-kotlin skill: - Add the direct-sandbox (`integration/standard/<module>/`) tier alongside the existing unit and proxy tiers, and document that every tier is now organised by module (`realtime`, `liveobjects`, …). - Update §2 tier table, §4.2 directory tree + mental model, §7.3 SandboxApp (shared by both integration kinds), and §12 run commands in README.md, and mirror all of it in index.html (tags verified balanced, sections intact). - Generalise the skill's spec→test path mapping to `<module>`, add a direct-sandbox row, and split integration specs into fault-injecting (proxy) vs happy-path (direct sandbox) flows. - Correct stale "both tiers" wording now that there are three tiers.
…ckage mapping Rework the uts-to-kotlin skill to translate a whole UTS module at once instead of a single spec file: - Take a UTS module directory (e.g. .../specification/uts/objects) and validate it sits directly under uts/ with a standard tier structure. - Resolve the target ably-java package via uts-package-mapping.json (a new config file alongside the skill): a shared `testRoot` parent plus a `packages` table mapping each source module to its per-tier output dir (so objects -> liveobjects is explicit). Offer to create a mapping when one is missing. - Let the user pick a tier (unit / integration / proxy) and then translate all specs or a selected subset, looping each through the existing per-spec translation steps. Phase 1 (selection: Steps A-D) is new; Phase 2 (per-spec translation: Steps 1-7) keeps the existing rules, with Step 1/2 adjusted to consume the looped spec and the pre-resolved target.
…aluate mode Make the skill's selection phase deterministic and add an explicit translate-vs-evaluate choice: - Add scripts/resolve_uts.py — a bundled resolver that validates the module directory, reads uts-package-mapping.json, and emits JSON with, per tier, the target dir, Kotlin package, and the candidate specs with derived class names. This replaces the per-run hand-work (regex validation, path joins, snake_case->PascalCase) that the model previously improvised, so Phase 1 is byte-for-byte deterministic. Exclusions are checked relative to the tier base (robust to the checkout location), and --create guards the target name. - Rewrite Phase 1 (Steps A-E) around the resolver: resolve, confirm/create mapping, choose tier, choose specs, choose translate-only vs evaluate. - Gate Step 6 (run/fix) behind evaluate mode per writing-derived-tests.md's Translation (always) vs Evaluation (only when an implementation exists) split; translate-only stops after compile + review. - Make the reference fetch mandatory (WebFetch added to allowed-tools). - Fix the file template to use the resolver's package/className (no hardcoded realtime, no double Test suffix) and the spec's full @uts id; correct stale uts/test/... proxy doc paths.
…rence The objects UTS specs are written in ably-js-style pseudocode, but ably-java is a typed SDK (RTTS1-10 partition). Add references/objects-mapping.md mapping each ably-js symbol to its ably-java equivalent: entry point, async (CompletableFuture/await), the typed PathObject/Instance hierarchies and as* casts, the LiveMapValue write union, creation value types, subscriptions, sync-state events, ValueType, message/operation getters, error codes, path dot-escaping, and the internal-graph caveat for unit specs. Wire it in deterministically: each module declares its translation reference via a `notes` field in uts-package-mapping.json; resolve_uts.py resolves it to `translationNotes` (absolute path, or null), and SKILL.md makes it required reading before Phase 2 when present.
…ap them Translate objects/helpers/standard_test_pool.md into ably-java test helpers in uts/.../unit/liveobjects/helpers.kt: the standard object pool, the protocol- and object-message builders (emitting the integer-coded wire JSON the SDK's Gson expects), setupSyncedChannel/NoAck over the existing MockWebSocket, and buildPublicObjectMessage — which reaches the internal PAOM3/PAOOP3 construction (WireObjectMessage -> DefaultObjectMessage) by reflection, so it runs today even though the rest of :liveobjects is unimplemented. Add testRuntimeOnly(:liveobjects) so that reflection resolves while keeping the compile classpath decoupled. Wire the mapping reference at it: objects-mapping.md gains a "Unit-test helpers" section mapping each spec helper to its Kotlin name, and §11/§13 are corrected to note public_object_message.md is translatable via buildPublicObjectMessage rather than internal-only.
8276473 to
752b45e
Compare
e38b889 to
752b45e
Compare
…efactor - Add ChannelHistoryTest (RTL10d) and TokenRequestTest (RSA9/RSA9a/RSA9g) direct-sandbox integration tests, parameterised over json/msgpack. - Add junit-jupiter-params dependency (@ParameterizedTest / @valuesource). - Consolidate the sandbox host into a single SandboxApp.sandboxHost constant (removed from ProxyManager; ProxySession defaults both hosts to it). - Sync uts/README.md, uts/index.html, and the uts-to-kotlin SKILL.md for the direct-sandbox tier: new ChannelHistoryTest walkthrough, integration-tests umbrella section, section renumber. - Rename unit liveobjects helpers.kt -> Helpers.kt (case-only).
uts-to-kotlin skill to generate tests
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
.claude/skills/uts-to-kotlin/SKILL.md (1)
353-374: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMake this template tier-specific and use explicit imports.
This scaffold is presented as the resolver-selected tier template, but it still hardcodes unit-only setup (
infra.unit.*,MockWebSocket,ConnectionDetails) and star imports. That makes the integration/proxy path easy to start from the wrong skeleton even though later sections requireSandboxApp/ProxySessionwiring. Split this into per-tier templates (or relabel this one as unit-only) and list concrete imports instead of*.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.claude/skills/uts-to-kotlin/SKILL.md around lines 353 - 374, This template is still unit-only even though it is presented as the resolver-selected tier scaffold, and it also relies on star imports. Update the Skill.md template around the test scaffold to either split it into separate tier-specific templates or clearly label this one as unit-only, and replace the wildcard imports with explicit imports for the exact symbols used. Make sure the correct tier-specific setup is shown for the resolver path, especially the symbols that differ between unit and integration/proxy flows such as SandboxApp and ProxySession.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.claude/skills/uts-to-kotlin/references/objects-mapping.md:
- Around line 530-545: The helper reference in the objects-mapping docs uses the
wrong filename casing, so update the guidance to point consistently to
Helpers.kt instead of helpers.kt. Fix the prose and the table entry that
references uts/src/test/kotlin/io/ably/lib/uts/unit/liveobjects/Helpers.kt so
readers can locate the actual helper file and related symbols like
setupSyncedChannel, setupSyncedChannelNoAck, buildObjectSyncMessage, and
buildPublicObjectMessage without path mismatches.
- Around line 137-147: Add language tags to the fenced code examples in the
objects-mapping reference so markdownlint stops flagging them and syntax
highlighting is restored. Update the affected examples in the translation
guidance sections around the root.entries()/root.keys() snippets and the other
noted example blocks to use an appropriate tag such as kotlin, markdown, or
text, keeping the existing content unchanged.
In `@uts/build.gradle.kts`:
- Around line 44-54: The custom Test tasks runUtsUnitTests and
runUtsIntegrationTests only set filters, so they are not actually wired to the
UTS test source set. Update these tasks in uts/build.gradle.kts to inherit the
same testClassesDirs and classpath as the built-in test task, and keep the
existing includeTestsMatching filters so they execute the intended
io.ably.lib.uts.unit and io.ably.lib.uts.integration tests instead of passing
empty.
In `@uts/README.md`:
- Around line 42-59: The README contains unlabeled fenced code blocks that
trigger markdownlint and lose syntax highlighting. Update the fenced blocks in
the affected diagram/example sections to include an appropriate language
identifier such as text or kotlin, using the same README content around the
spec/test hierarchy and other referenced fenced blocks, so the markdown stays
lint-clean and renders correctly.
---
Nitpick comments:
In @.claude/skills/uts-to-kotlin/SKILL.md:
- Around line 353-374: This template is still unit-only even though it is
presented as the resolver-selected tier scaffold, and it also relies on star
imports. Update the Skill.md template around the test scaffold to either split
it into separate tier-specific templates or clearly label this one as unit-only,
and replace the wildcard imports with explicit imports for the exact symbols
used. Make sure the correct tier-specific setup is shown for the resolver path,
especially the symbols that differ between unit and integration/proxy flows such
as SandboxApp and ProxySession.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 27e70f9e-9e77-46d5-a860-34d544c796f2
📒 Files selected for processing (32)
.claude/skills/uts-to-kotlin/SKILL.md.claude/skills/uts-to-kotlin/references/objects-mapping.md.claude/skills/uts-to-kotlin/scripts/resolve_uts.py.claude/skills/uts-to-kotlin/uts-package-mapping.json.github/workflows/check.yml.github/workflows/integration-test.ymluts/README.mduts/build.gradle.ktsuts/index.htmluts/src/test/kotlin/io/ably/lib/types/Utils.ktuts/src/test/kotlin/io/ably/lib/uts/deviations.mduts/src/test/kotlin/io/ably/lib/uts/infra/Utils.ktuts/src/test/kotlin/io/ably/lib/uts/infra/integration/SandboxApp.ktuts/src/test/kotlin/io/ably/lib/uts/infra/integration/proxy/ProxyManager.ktuts/src/test/kotlin/io/ably/lib/uts/infra/integration/proxy/ProxySession.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/ClientFactories.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/DefaultPendingConnection.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/DefaultPendingRequest.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/FakeClock.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockEvent.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockHttpClient.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockHttpEngine.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockWebSocket.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockWebSocketEngineFactory.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/PendingConnection.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/PendingRequest.ktuts/src/test/kotlin/io/ably/lib/uts/infra/unit/Utils.ktuts/src/test/kotlin/io/ably/lib/uts/integration/proxy/realtime/AuthReauthTest.ktuts/src/test/kotlin/io/ably/lib/uts/integration/standard/realtime/ChannelHistoryTest.ktuts/src/test/kotlin/io/ably/lib/uts/integration/standard/realtime/TokenRequestTest.ktuts/src/test/kotlin/io/ably/lib/uts/unit/liveobjects/Helpers.ktuts/src/test/kotlin/io/ably/lib/uts/unit/realtime/ConnectionRecoveryTest.kt
💤 Files with no reviewable changes (1)
- uts/src/test/kotlin/io/ably/lib/types/Utils.kt
There was a problem hiding this comment.
Pull request overview
This PR improves the uts/ module’s usability and automation by adding a comprehensive UTS guide + standalone HTML site, restructuring UTS test packages under io.ably.lib.uts, and wiring per-tier Gradle/CI test tasks. It also expands integration test coverage (direct sandbox) and updates the uts-to-kotlin skill to support module-wide translation with deterministic path/package resolution.
Changes:
- Added human-readable UTS documentation (
uts/README.md) plus an offline-friendly mirrored website (uts/index.html). - Reorganized UTS test + infra packages (
io.ably.lib.uts.*), introduced per-tier Gradle tasks, and updated CI to run unit vs integration tiers separately. - Added/updated UTS-derived tests and LiveObjects UTS helper infrastructure to support generated test suites.
Reviewed changes
Copilot reviewed 31 out of 32 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| uts/src/test/kotlin/io/ably/lib/uts/unit/realtime/ConnectionRecoveryTest.kt | Moves test into io.ably.lib.uts.unit.* namespace and adds a reconnect gating step to reduce transient-state flake. |
| uts/src/test/kotlin/io/ably/lib/uts/unit/liveobjects/Helpers.kt | Adds LiveObjects wire-message builders and synced-channel setup helpers (incl. reflective construction of internal liveobjects message types). |
| uts/src/test/kotlin/io/ably/lib/uts/integration/standard/realtime/TokenRequestTest.kt | Adds direct-sandbox integration coverage for token request creation being accepted by the service. |
| uts/src/test/kotlin/io/ably/lib/uts/integration/standard/realtime/ChannelHistoryTest.kt | Adds direct-sandbox integration coverage for cross-client history durability, parameterized over protocol format. |
| uts/src/test/kotlin/io/ably/lib/uts/integration/proxy/realtime/AuthReauthTest.kt | Repackages proxy integration test to new io.ably.lib.uts.integration.* layout and updates infra imports. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/Utils.kt | Moves shared async helpers into io.ably.lib.uts.infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/Utils.kt | Introduces reflective ConnectionDetails { ... } builder DSL in unit infra (replacing prior package-local constructor access). |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/PendingRequest.kt | Repackages unit infra pending-request abstraction under io.ably.lib.uts.infra.unit. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/PendingConnection.kt | Repackages unit infra pending-connection abstraction under io.ably.lib.uts.infra.unit. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockWebSocketEngineFactory.kt | Repackages mock WebSocket engine factory under io.ably.lib.uts.infra.unit. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockWebSocket.kt | Repackages mock WebSocket infra and aligns imports with new unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockHttpEngine.kt | Repackages mock HTTP engine infra and updates references after package move. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockHttpClient.kt | Repackages mock HTTP client infra under unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/MockEvent.kt | Repackages transport event logging types under unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/FakeClock.kt | Repackages fake clock under unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/DefaultPendingRequest.kt | Repackages default pending-request implementation under unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/DefaultPendingConnection.kt | Repackages default pending-connection implementation under unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/unit/ClientFactories.kt | Repackages test client factories under unit infra. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/integration/SandboxApp.kt | Moves sandbox provisioning helper into io.ably.lib.uts.infra.integration and centralizes sandboxHost. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/integration/proxy/ProxySession.kt | Updates proxy session to new infra packages and defaults upstream host via SandboxApp.sandboxHost. |
| uts/src/test/kotlin/io/ably/lib/uts/infra/integration/proxy/ProxyManager.kt | Repackages proxy manager and removes redundant sandbox host constants now owned by SandboxApp. |
| uts/src/test/kotlin/io/ably/lib/uts/deviations.md | Adds/records documented SDK-vs-spec deviations discovered during UTS translation. |
| uts/src/test/kotlin/io/ably/lib/types/Utils.kt | Removes legacy ConnectionDetails builder previously placed in io.ably.lib.types. |
| uts/README.md | Adds comprehensive UTS guide covering tiers, infra, layout, and how to run tests. |
| uts/index.html | Adds standalone offline documentation site mirroring uts/README.md. |
| uts/build.gradle.kts | Adds JUnit params dep, runtime-only liveobjects dep for reflective tests, and tier-filtered test tasks. |
| .github/workflows/integration-test.yml | Adds check-uts job to run :uts:runUtsIntegrationTests in CI. |
| .github/workflows/check.yml | Updates PR gate to run :uts:runUtsUnitTests instead of all UTS tests. |
| .claude/skills/uts-to-kotlin/uts-package-mapping.json | Adds explicit mapping from UTS modules to uts/ target packages/dirs for the translation skill. |
| .claude/skills/uts-to-kotlin/SKILL.md | Expands the uts-to-kotlin skill to module-wide translation with tier selection and deterministic resolution. |
| .claude/skills/uts-to-kotlin/scripts/resolve_uts.py | Adds deterministic resolver script for module→tier→package/class-name mapping used by the skill. |
| .claude/skills/uts-to-kotlin/references/objects-mapping.md | Adds a detailed objects→liveobjects (ably-js→ably-java) translation map for the skill and contributors. |
Comments suppressed due to low confidence (1)
uts/src/test/kotlin/io/ably/lib/uts/unit/realtime/ConnectionRecoveryTest.kt:249
capturedQueryParamsis mutated fromMockWebSocket.onConnectionAttempt(runs synchronously on the SDK thread) and read frompollUntil(usesDispatchers.Default). Using a plainmutableListOf()here can introduce a data race/flaky test behavior under concurrency. Prefer a thread-safe collection (e.g.CopyOnWriteArrayList) or synchronize both the writer and thepollUntilpredicate.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- objects-mapping.md: correct helper filename casing helpers.kt -> Helpers.kt (broken source-nav on case-sensitive filesystems); tag bare code fences as `text` to clear markdownlint MD040. - README.md: tag bare fences as `text`; correct the msgpack rationale — ably-java does implement msgpack (useBinaryProtocol = true by default), the real reason proxy tests force JSON is that the proxy only handles text WebSocket frames. - index.html: mirror the README msgpack correction. - SKILL.md: label the unit-tier test scaffold as such and point integration/proxy flows at the SandboxApp/ProxySession section. - resolve_uts.py: validate the module path via Path.parts instead of a forward-slash-only regex, so Windows paths are accepted. - ConnectionRecoveryTest: use CopyOnWriteArrayList for the query-param capture list (written on the SDK transport thread, read on the coroutine dispatcher) to remove a visibility race / flake risk. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Translation review (SKILL.md Step 7) relied on eyeballing the spec and the generated Kotlin side-by-side to confirm every test case, setup step, operation and assertion was carried over — exactly the mechanical comparison the model does inconsistently. Add a bundled extractor so the review reconciles a concrete ledger instead. scripts/audit_translation.py (regex-only, no semantic judgement, deterministic): - idCoverage: spec `**Test ID**` set vs Kotlin `@UTS` tags -> missing / orphan. - perTest[].sections: every non-comment pseudo-block line, grouped by section and tagged assert / await / step, so setup + operations + assertions are all enumerated; assertionShortfall flags likely-dropped assertions. - Robustness: never crashes — tolerant decoding plus a top-level guard always emit one JSON object. Exit 0 clean / 2 missing-or-orphan / 64 couldn't-run, via a fail() helper matching resolve_uts.py's error shape. SKILL.md Step 7 now runs the audit first and reconciles its output line by line (coverage + completeness), keeping setup-fidelity and deviation-honesty as the semantic checks; paths reference the resolver's specs[].file / targetDir.
0834c45
into
feature/path-based-liveobjects-implementation
uts-to-kotlinskill to better generateably-javatestssandboxtest, need to update the same📚 Human-readable UTS guide + website
To make the UTS setup approachable, this PR adds a comprehensive guide and a self-contained website, kept in sync:
uts/README.md— renders on the module's GitHub page.uts/index.html— a standalone, offline-friendly website (inline SVG flow diagrams, scroll-spy nav, light/dark theme; no external assets).Both walk through: what UTS is → the three test tiers → the spec docs (linked to GitHub) → the
uts/module layout → the SDK hook points → the unit & proxy infrastructure → the two example tests → deviations → how to run → appendices (flow diagrams + per-file API reference + source map).🗂️ Test package restructure
Test sources are reorganised under a domain-rooted
io.ably.lib.utspackage that cleanly separates infrastructure from tests, and unit from integration:The
unit/↔infra/unit/andintegration/↔infra/integration/pairing is what the new Gradle tasks key off.⚙️ Per-tier Gradle tasks + CI wiring
Added two package-filtered test tasks in
uts/build.gradle.kts, mirroringrunLiveObjectsUnitTests/runLiveObjectsIntegrationTests::uts:runUtsUnitTestsio.ably.lib.uts.unit.*(mocked, fast)check.yml(PR gate):uts:runUtsIntegrationTestsio.ably.lib.uts.integration.*(real sandbox + proxy)integration-test.yml→ newcheck-utsjob✅ Validation
./gradlew :uts:runUtsUnitTests→ 6/6 pass ·:uts:runUtsIntegrationTests→ 1/1 pass.checkWithCodenarc checkstyleMain checkstyleTest runUnitTests runLiveObjectsUnitTests :uts:runUtsUnitTests→ BUILD SUCCESSFUL.Summary by CodeRabbit